//
//  SYVIewModel.swift
//  SYWeibo
//
//  Created by Saya on 16/4/10.
//  Copyright © 2016年 黄金果. All rights reserved.
//

import UIKit
//在class外面生成的变量为全局的
private let userInfoKey = "sayaHuang.WEIBO"

class SYVIewModel: NSObject {
    //这个类也最好是个单例,便于管理
    static let viewModel:SYVIewModel = SYVIewModel()
    
    
    //完全私有化的做法,重写并且私有化init方法
    //如果每次读取数据都是从内存中读取,做I/O操作的话比较耗费性能,所以提供一个变量在init的时候将数据保存到变量中,公开比较合适,外界需要访问
    //MARK:供外界调用的数据
    var userInformation :SYUserAccount?
    
    var userIconUrl :NSURL? {
        let tempURL = NSURL(string: userInformation?.avatar_large ?? "")
        return tempURL
    }
    
    var isLogin :Bool {
        //如果数据模型不为空,且没有过期
        //
        if let info = userInformation where info.expires_over!.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            return true
        }
        userInformation = nil
        return false
    }
    
    private override init() {
        super.init()
        userInformation = loadUserAccountData()
    }
    
    func requestAccessCode (code:String,finishBlock:(isSucceed:Bool)->()){
        SYAFNTools.shareTools.loginUserToken(code) { (reslut, error) -> Void in
            if error != nil {
                print(error)
                finishBlock(isSucceed: false)
                return
            }
            
            //            print(reslut)
            if let reaponseBodey = reslut as? [String:AnyObject]{
                self.requestUserInfo(reaponseBodey, finishBlock: finishBlock)
            }
        }
    }
    
    private func requestUserInfo (reasponse:[String:AnyObject],finishBlock:(isSucceed:Bool)->()){
        SYAFNTools.shareTools.loginUserInfo(reasponse) { (reslut, error) -> Void in
            if error != nil{
                print(error)
                finishBlock(isSucceed: false)
                return
            }
            //            print(reslut)
            
            
            //合并数组
            //由于reslut是anyObject,所以reslut不能使用字典的方法,需要先转换
            //as 后面使用问号表示,有可能转换为[String:AnyObject],也有可能转换为nil,为什么不直接使用!,是因为如果使用!强制解包,如果不为字典呢,那么强制解包就会出现问题
            guard var userInfo:[String:AnyObject] = reslut as? [String:AnyObject] else{
                finishBlock(isSucceed: false)
                return
            }
            for (key,value) in reasponse{
                userInfo[key] = value
            }
            
            //将数据保存到偏好设置中,只是为什么要保存到偏好设置呢?
                        print(reslut)
            
            self.saveUserAccountData(userInfo, finishBlock: finishBlock)
        }
    }

}

extension SYVIewModel {
    private func saveUserAccountData (userInfo:[String:AnyObject],finishBlock:(isSucceed:Bool)->()){
        //将数组转模型,这样做是为了将数组中不需要的数据过滤掉
        let useInfoModel = SYUserAccount.init(dict: userInfo)
        //在将模型转为数组
        let keys :[String] = ["access_token","expires_in","uid","name","avatar_large","expires_over"]
        let dict :[String:AnyObject] = useInfoModel.dictionaryWithValuesForKeys(keys)
        //将字典保存到偏好设置中,用一个唯一的key标识
        let userDefault = NSUserDefaults.standardUserDefaults()
        userDefault.setObject(dict, forKey: userInfoKey)
        userDefault.synchronize()
        
        //如果用户第一次登录成功,那么此时userInformation为nil,所以外界使用userInformation判断是否登录会崩溃,所以需要在这边将userInformation赋值
        userInformation = useInfoModel
        finishBlock(isSucceed: true)
    }
    
    //提供一个读取用户数据的方法
    func loadUserAccountData ()-> SYUserAccount?{
        let userDefault = NSUserDefaults.standardUserDefaults()
        
        //如果想要将错误的情况下的处理具体用代码处理一下,建议使用guard
//        guard let tempDict = userDefault.objectForKey(userInfoKey) as? [String:AnyObject] else {
//           print("数据错误")
//        }
//        return SYUserAccount.init(dict: tempDict)
        
        if let tempDict = userDefault.objectForKey(userInfoKey) as? [String:AnyObject]{
            return SYUserAccount.init(dict: tempDict)
        }
        return nil
        
    }
}














